今天繼續試小木偶前輩,有講解,沒實作的例子:
http://home.educities.edu.tw/wanker742126/asm/ch12.html
前輩說:
這兩個指令使用方法和 MOVSB﹑MOVSW 相同,而它的作用是將一個字串和另一處的字串比較。如果只有單獨的一個 CMPSB 或 CMPSW 時,CPU 只比較一個位元組或一個字組;當 CMPSB 或 CMPSW 前加上 REP 時,可以比較一個字串。您也可以用 REPE ( 表示 repeat while equal,如果兩字相等則重複 ) 來代替 REP,也可以用 REPZ ( 表示 repeat while zero,如果零旗標為 ZR,則重複 ) 來代替,換句話說 REP﹑REPE 和 REPZ 是相同的。
那您可能會問,如何才知道兩個字串相等?這時您就得檢查『零旗標』了,如果零旗標被設為一 (DEBUG 顯示 ZR),表示兩字串相等,此時兩字串會比較完畢所以 CX 也會一直減少至零。如果零旗標被設為零 (DEBUG 顯示 NZ),表示兩字串不相等,cmps 指令僅僅比較到第一個不相等的字元就停止了,所以 CX 不會為零,SI﹑DI 會指到第一個不相等的位元組或字組之後的位址。
與 MOVS 指令相同的是,CMPS 指令也可以用方向旗標來指定向高位址比較或向低位址比較。
我們來試試
08FA:0100 mov si,200
08FA:0103 mov di,300
08FA:0106
-a 200
08FA:0200 db "Tim"
08FA:0203
-a 300
08FA:0300 db "Tom"
08FA:0303
-a 106
08FA:0106 cmpsb
08FA:0107
單步執行,發現執行完cmpsb時,因為兩字串第一字元都是T所以零旗標由NZ變成ZR。
---------------------------
再來試一下rep cmpsb的效果。
-a
08FA:0100 mov cx,3
08FA:0103 mov si,200
08FA:0106 mov di,300
08FA:0109 rep cmpsb
08FA:010B
-a 200
08FA:0200 db "Tim"
08FA:0203
-a 300
08FA:0300 db "Tom"
08FA:0303
單步執行,
第一次比較,T和T相等,第二次比較,i和o不相等,
這時候,再執行下一步,發現不會再比較了,
所以rep cmpsb,會比較到相異時,即停止。
而單步執行時,發現執行的指令是REPE CMPSB,
亦回應,REP,在做字串比較時,等同於REPE,相同時即重覆,相異時即停止的特性。
當相異時,再單步執行,
發現INC SI,SI=0203 DI=0302,DI沒有跟著加1了。
小結:除了加減後結果為0會讓零旗標由NZ變成ZR。比較字串時,當字元相等時,也會
讓零旗標由NZ變成ZR。而不相同時,即停止比較了,IP指令指標暫存器往下指了,不再REPE了。
回頭學C語言時,發現C語言沒有字串這個型別,有字元(CHAR)型別,及字元陣列型別,
看起來,C語言這段和組語是一致的,一個byte一個byte比。
組語真是一個單純的世界,就像是另一半,對她好,她就會照三餐煮出滿桌的菜,就算颱風天也要出門去買菜,雖然口裏抱怨這抱怨那,但滋味是甜蜜的。
Tim大另一半要知道有組語這回事,不知會不會掀翻醋醰子了.....